/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.servicio.interfaces.IServicioHistorial;
import desarrollosoft.ghce.vista.interfaces.Actualizable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraCrearElemento extends SelectorComposer<Window> implements Actualizable {
    
    @WireVariable("servicioHistorial")
    private IServicioHistorial servicioHistorial;
    
    private Paciente pacienteElegido;
    
    private Actualizable actualizablePadre;
    
    private Window ventanaAnterior;
    
    @Wire
    private Combobox comboboxTipificacion;
    
    @Wire
    private Window ventanaContenido;
    
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        hacerAntesDeDibujar();
        super.doAfterCompose(comp);
        hacerDespuesDeDibujar();
    }
    
    private void hacerAntesDeDibujar() {
        Execution ejecucion = Executions.getCurrent();
        pacienteElegido = (Paciente) ejecucion.getArg().get("pacienteElegido");
        actualizablePadre = (Actualizable) ejecucion.getArg().get("actualizable");
    }
    
    private void hacerDespuesDeDibujar() {
        List<String> listaTipificaciones = servicioHistorial.obtenerTodasTipificaciones();
        comboboxTipificacion.setModel(new ListModelList<>(listaTipificaciones));
    }
    
    @Listen("onSelect = #comboboxTipificacion")
    public void elegieronTipificacion() {
        
        if (pacienteElegido.getBajaLogicaPaciente() != null) {
            Messagebox.show("No puede crear nuevos elementos a un Paciente dado de baja");
            return;
        }
        
        String tipificacion = comboboxTipificacion.getSelectedItem().getValue();
        Map<String,Object> argumentos;
        Window ventana = null;
        
        switch (tipificacion) {
            case "Consulta":
                argumentos = new HashMap<>();
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("estado", Estado.CREANDO);
                argumentos.put("actualizable", this);
                ventana = (Window) Executions.createComponents("VentanaConsulta.zul", null, argumentos);
                break;
            case "Tratamiento":
                argumentos = new HashMap<>();
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("estado", Estado.CREANDO);
                argumentos.put("actualizable", this);
                ventana = (Window) Executions.createComponents("VentanaTratamiento.zul", null, argumentos);
                break;
            case "Intervencion":
                argumentos = new HashMap<>();
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("estado", Estado.CREANDO);
                argumentos.put("actualizable", this);
                ventana = (Window) Executions.createComponents("VentanaIntervencion.zul", null, argumentos);
                break;
            case "Estudio":
                argumentos = new HashMap<>();
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("estado", Estado.CREANDO);
                argumentos.put("actualizable", this);
                ventana = (Window) Executions.createComponents("VentanaPedidoEstudioLaboratorio.zul", null, argumentos);
                break;
        }
        
        if (ventanaAnterior != null) {
            ventanaContenido.removeChild(ventanaAnterior);
        }
        if (ventana != null) {
            ventanaContenido.appendChild(ventana);
            ventanaAnterior = ventana;
        }
    }

    @Override
    public void guardaronVentanaHija(Object objetoActualizado) {
        actualizablePadre.guardaronVentanaHija(objetoActualizado);
        cancelaron(); // hago como que cancelaron para que se borre la eleccion del combobox
    }

    @Override
    public void cancelaron() {
        comboboxTipificacion.setSelectedIndex(0);
        elegieronTipificacion();
    }
}
